/* =============================================================================
PROJET           : c-social-network
NOM DU FICHIER   : graph.h
OBJET            : Header du module personne.
--------------------------------------------------------------------------------
DATE DE CREATION : 30/04/10
AUTEUR           : Benjamin MICHEL
--------------------------------------------------------------------------------
MODIFICATIONS (   n) date - auteur - description )
    1) 27/04/10 - Benjamin MICHEL - création de la structure, et des fonctions
============================================================================= */

/*Usage de t_personne*/
#include "../personne/personne.h"

/*==============================================================================
structure t_graph:
    -taille: Le nombre d'éléments dans le tableau
    -curseur: La position dans le graph
    -t_tabl_pers: tableau de structures t_tabl_pers

structure t_tabl_pers:
    -pers: pointeur sur t_personne
    -confiance: pointeur sur la liste de personnes en qui une personne fait confiance

IMPORTANT:
    -initialisation:
        t_graph *graph = NULL;
*/
typedef struct _graph t_graph;
typedef struct _tabl_pers t_tabl_pers;
struct _graph{
    int taille;
    int curseur;
    struct _tabl_pers{
        t_personne *pers;
    } *tabl_pers;
};


/*
fonction cree(IN: int taille) return *t_graph;
renvoie un pointeur sur un graph de taille "taille"

--ensure:
--  is_vide(graphe) == TRUE
*/
t_graph* creer( int );

/*
function is_vide(IN: t_graph *graph) return Bool;
vrais si vide faux sinon

--ensure:
*/
int is_vide(const t_graph *);


/*
procedure insert_pers(IN: t_personne * pers, IN OUT: t_graph ** graph);
insère une personne dans le graph

--require:
--	graph->curseur < taille - 1

NOTE: Si on met
		void insert_pers(const t_personne *, t_graph *);
on reçoit
		error: conflicting types for ‘insert_pers’
Cependant la personne reste constante
*/
void insert_pers(t_personne *, t_graph *);


/*
function get_next_pers(IN: t_graph *graph) return *t_personne;
récupère la personne localisée sur le curseur

--require:
--	f_personne.is_vide(graph->tabl_pers[graph->curseur]->pers) != VIDE
--
--  graph->curseur > 0
--note:
--  incrémente le curseur de 1 si on est pas à la fin du graph sinon revient à 0
*/
t_personne *get_next_pers(t_graph *);

/*
function get_taille(IN: t_graph *graph) return int;
donne la taille du graph

--require:
--  graph créé
*/
int get_taille(const t_graph *);


/*
function get_curseur(IN: t_graph *graph)return int;
donne la position du curseur

--require:
--  graph créé
*/
int get_curseur(const t_graph *);


/*
procedure destroy(OUT: t_graph *graph);
détruit le graph, et tout les éléments d'il contient

--ensure:
--  is_vide(graph) == TRUE
*/
void destroy(t_graph **);

